To remain competitive in today's economic and technological environment, software-oriented companies are placing an increasing focus on creating software solutions that appeal to users, developers and the industry in general. One particular technology that has such appeal is “component software,” which can be integrated within new and existing application frameworks.
Component software technology appeals to users because it is generally platform independent, meaning that users can run the underlying software through a container (such as a Web browser) on computers having different hardware architectures and/or operating systems. Component software appeals to developers because they need only write code in the programming language of the component software, and not worry about having to learn the various programming languages used by individual companies. Component software appeals to the industry in general because it fosters interoperability among disparate systems and services.
A software “component” of component software technology is a reusable callable piece of software that is not native to a calling application. (The non-native aspect of the software component signifies that the component is executed in a different software runtime environment than that of the calling application, irrespective of whether the software component and calling application reside on the same or remote servers.) Examples of existing component software technology include COM objects, .NET applications, CORBA objects and JavaBeans. A component can exist in both a “stateless” or “stateful” form. In a stateless form, the component is created (or instantiated) when called by an application, performs its task and then terminates, releasing all state information (e.g., any information held during the performance of the task). In a stateful form, the component remains instantiated after performing a task until the application specifically terminates it; thus, information is retained between separate component calls.
There are both advantages and disadvantages associated with stateless and stateful software components. Stateless components have less system resource overhead since they are not in existence for long and do not store state information; however, communication traffic between the calling application and the stateless component may be increased because the calling application has to instantiate the component every time it needs a task performed, and each instantiation call may carry bandwidth-consuming information necessary for the task to be performed. On the other hand, stateful components have more system resource overhead since they retain state information, but the accompanying communication traffic may be reduced since the calling application does not have to keep re-sending duplicate information (e.g., parameter data) to the component every time it is called to perform a task.
Currently, component developers analyze the nature of the task to be performed by the software component in order to decide whether to utilize a stateless or stateful software component to implement the task. For example, a stateless component may be better suited to implement a task that does not get called often and that does not require much information to be passed to it from the calling application. A stateful component may be better suited to implement a task that gets called quite often but processes the same information which can be held internally. Once a decision is made as to the type (stateless/stateful) of component to utilize, the developer codes the component and either integrates it into an application framework or makes sure that the application framework can access the component at runtime.
There are shortcomings associated with this development process and runtime solution, however. In some cases the nature of the task to be performed by the software component is not fully known until runtime, at which time the decision has already been made as to the type of component that will implement the task. The use of the wrong type of component can lead to a significant hit in runtime performance.
Accordingly, there is a need in the art for a system and method that dynamically selects at runtime the type of component to invoke in order to implement a particular task.